package com.moyq5.spring.boot.app.register.server;

import com.moyq5.spring.boot.app.register.AppGroupCreator;
import com.moyq5.spring.boot.app.register.AppGroupStore;
import com.moyq5.spring.boot.app.register.AppGroupStoreDefault;

/**
 * 定时任务配置信息
 * @author Moyq5
 * @date 2019年1月15日
 */
public class AppInfoRegisterServerConfig {

	private int timeout = 30;
	
	private AppInfoNotifier notifier;
	
	private AppGroupStore groupStore = new AppGroupStoreDefault();
	
	private AppGroupCreator creator = new AppGroupCreatorDefault();
	
	/**
	 * 应用在线超时时间（秒）,默认为30秒
	 * @author Moyq5
	 * @date 2019年3月6日
	 * @return
	 */
	public int getTimeout() {
		return timeout;
	}

	/**
	 * 指定应用在线超时时间（秒）。当任务最近在线时间超过这个时间间隔后，
	 * 系统会认为该应用已经离线，并从应用组中对该应用信息做相应的"离线"标志，最后通知同组其它应用做相关调整。
	 * @author Moyq5
	 * @date 2019年3月6日
	 * @param timeout
	 */
	public void setTimeout(int timeout) {
		this.timeout = timeout;
	}

	/**
	 * 应用组存储器，默认实现为<code>TaskGroupStoreDefault</code>
	 * @author Moyq5
	 * @date 2019年3月6日
	 * @return
	 */
	public AppGroupStore getGroupStore() {
		return groupStore;
	}

	/**
	 * 指定任务组存储器，用于存储任务信息。如果不指定，默认为<code>TaskGroupStoreDefault</code>
	 * @author Moyq5
	 * @date 2019年3月6日
	 * @param groupStore
	 * @see {@link AppGroupStoreDefault}
	 */
	public void setGroupStore(AppGroupStore groupStore) {
		this.groupStore = groupStore;
	}

	/**
	 * 获取应用组实例创建者实类，默认为<code>InstanceCreatorDefault</code>
	 * @author Moyq5
	 * @date 2019年3月8日
	 * @see {@link AppGroupCreatorDefault}
	 * @return
	 */
	public AppGroupCreator getCreator() {
		return creator;
	}

	/**
	 * 指定应用组实例创建者实类，默认为<code>InstanceCreatorDefault</code>
	 * @author Moyq5
	 * @date 2019年3月8日
	 * @see {@link AppGroupCreatorDefault}
	 */
	public void setCreator(AppGroupCreator creator) {
		this.creator = creator;
	}

	public AppInfoNotifier getNotifier() {
		if (null == notifier) {
			throw new RuntimeException("AppInfoNotifier 默认实现不存在，请在调用之前先通过" + AppInfoRegisterServerConfig.class.getName() + ".setNotifier()方法指定默认实现");
		}
		return notifier;
	}

	public void setNotifier(AppInfoNotifier notifier) {
		this.notifier = notifier;
	}

}
